///*
// *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
// *
// *  Redistribution and use in source and binary forms, with or without
// *  modification, are permitted provided that the following conditions are met:
// *
// *  Redistributions of source code must retain the above copyright notice,
// *  this list of conditions and the following disclaimer.
// *  Redistributions in binary form must reproduce the above copyright
// *  notice, this list of conditions and the following disclaimer in the
// *  documentation and/or other materials provided with the distribution.
// *  Neither the name of the dreamlu.net developer nor the names of its
// *  contributors may be used to endorse or promote products derived from
// *  this software without specific prior written permission.
// *  Author: Chill 庄骞 (smallchill@163.com)
// */
//package com.plian.system.service.fr.bank.impl;
//
//import com.plian.Tools.BigDecimalUtil;
//import com.plian.Tools.CollectionUtil;
//import com.plian.Tools.StringUtil;
//import com.plian.Tools.pagedata.PageData;
//import com.plian.system.dto.fr.bank.BankTradeDetailDTO;
//import com.plian.system.entity.fr.bank.BankTradeDetail;
//import com.plian.system.entity.fr.enterprise.Enterprise;
//import com.plian.system.mapper.fr.bank.BankTradeDetailMapper;
//import com.plian.system.mybatis.base.BaseServiceImpl;
//import com.plian.system.service.fr.bank.IBankTradeDetailService;
//import com.plian.system.service.fr.enterprise.IEnterpriseService;
//import com.plian.system.vo.fr.bank.BankTradeDetailVO;
//import com.plian.system.vo.fr.bank.TradeStatisticsVO;
//import com.plian.system.vo.report.*;
//import lombok.AllArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Optional;
//import java.util.stream.Collectors;
//
///**
// * 服务实现类
// *
// * @author
// * @since 2019-09-27
// */
//@Slf4j
//@Service
//@AllArgsConstructor
//public class BankTradeDetailServiceImpl extends BaseServiceImpl<BankTradeDetailMapper, BankTradeDetail> implements IBankTradeDetailService {
//
//	private IEnterpriseService enterpriseService;
//
//	@Override
//	@Transactional(rollbackFor=RuntimeException.class)
//	public boolean saveOrUpdate(BankTradeDetail bankTradeDetail) {
//		return super.saveOrUpdate(bankTradeDetail);
//	}
//
//	@Override
//	@Transactional(rollbackFor=RuntimeException.class)
//	public boolean deleteLogic(List<Long> ids) {
//		for (Long id : ids) {
//			BankTradeDetail bankTradeDetail = getById(id);
//			if (bankTradeDetail == null) {
//				return false;
//			}
//		}
//		return super.deleteLogic(ids);
//	}
//
//	@Override
//	public ReportReturnVO blockTradeStatistics(BankTradeDetailDTO bankTradeDetailDTO) {
//		List<TradeStatisticsVO> results = baseMapper.blockTradeStatistics(bankTradeDetailDTO.getTopGroupIds(),
//				bankTradeDetailDTO.getBeginTime(), bankTradeDetailDTO.getEndTime(), BigDecimalUtil.multiply(bankTradeDetailDTO.getAmount(), new BigDecimal(10000)));
//		return toReport(results);
//	}
//
//	@Override
//	public ChartsVO blockTradeAnalyze(BankTradeDetailDTO bankTradeDetailDTO) {
//		List<TradeStatisticsVO> results = baseMapper.blockTradeStatistics(bankTradeDetailDTO.getTopGroupIds(),
//				bankTradeDetailDTO.getBeginTime(), bankTradeDetailDTO.getEndTime(), BigDecimalUtil.multiply(bankTradeDetailDTO.getAmount(), new BigDecimal(10000)));
//		return toCharts(results);
//	}
//
//	@Override
//	public ReportReturnVO publicToPrivateStatistics(BankTradeDetailDTO bankTradeDetailDTO) {
//		List<TradeStatisticsVO> results = baseMapper.publicToPrivateStatistics(bankTradeDetailDTO.getTopGroupIds(),
//				bankTradeDetailDTO.getBeginTime(), bankTradeDetailDTO.getEndTime());
//		return toReport(results);
//	}
//
//	@Override
//	public ChartsVO publicToPrivateAnalyze(BankTradeDetailDTO bankTradeDetailDTO) {
//		List<TradeStatisticsVO> results = baseMapper.publicToPrivateStatistics(bankTradeDetailDTO.getTopGroupIds(),
//				bankTradeDetailDTO.getBeginTime(), bankTradeDetailDTO.getEndTime());
//		getUnitName(results);
//		return toCharts(results);
//	}
//	/**
//	 * @Author: Take-off
//	 * @Description: //TODO 获取集团简称
//	 * @Date: 9:39 AM 2022/8/18
//	 * @Param: [depositStatisticsVOList]
//	 * @return: void
//	 **/
//	private void getUnitName(List<TradeStatisticsVO> tradeStatisticsVOList){
//		if (CollectionUtil.isNotEmpty(tradeStatisticsVOList)){
//			List<String> orgIds = tradeStatisticsVOList.stream().map(TradeStatisticsVO::getTopGroupId).collect(Collectors.toList());
//			//获取集团简称
//			try {
//				List<Enterprise> enterprises = enterpriseService.findByOrgIds(orgIds);
//				for (TradeStatisticsVO tradeStatisticsVO:tradeStatisticsVOList){
//					List<Enterprise> enterpriseByOrg = enterprises.stream().filter(m -> m.getOrgId().equals(tradeStatisticsVO.getTopGroupId())).collect(Collectors.toList());
//					if (CollectionUtil.isNotEmpty(enterpriseByOrg)){
//						String unitCheck = enterpriseByOrg.get(0).getUnitCheck();
//						tradeStatisticsVO.setTopGroupName(unitCheck);
//					}
//				}
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//
//		}
//
//	}
//
//	@Override
//	public ReportReturnVO summaryList(BankTradeDetailDTO bankTradeDetailDTO) {
//		List<BankTradeDetailVO> data = baseMapper.summaryList(bankTradeDetailDTO);
//		List<BankTradeDetailVO> results = new ArrayList<>();
//		if (CollectionUtil.isNotEmpty(data)){
//			int totalCount = 0;
//			BigDecimal totalBalance = new BigDecimal(0);
//			BigDecimal totalAmonut = new BigDecimal(0);
//			int subtotalCount = 0;
//			BigDecimal subtotalBalance = new BigDecimal(0);
//			BigDecimal subtotalAmonut = new BigDecimal(0);
//			String lastTopGroupId = "";
//
//			for (int i = 0; i < data.size(); i++){
//				BankTradeDetailVO result = data.get(i);
//				if (StringUtil.isNotBlank(lastTopGroupId) && !lastTopGroupId.equals(result.getTopGroupId())){
//					BankTradeDetailVO subtotal = new BankTradeDetailVO();
//					subtotal.setTopGroupName("小计：" + subtotalCount);
//					subtotal.setBalance(subtotalBalance);
//					results.add(subtotal);
//					subtotalCount = 1;
//					subtotalBalance = result.getBalance();
//					subtotalAmonut = result.getAmount();
//				}else {
//					subtotalCount++;
//					subtotalBalance = BigDecimalUtil.add(subtotalBalance, result.getBalance());
//					subtotalAmonut = BigDecimalUtil.add(subtotalAmonut, result.getAmount());
//				}
//				lastTopGroupId = result.getTopGroupId();
//				totalCount++;
//				totalBalance = BigDecimalUtil.add(totalBalance, result.getBalance());
//				totalAmonut = BigDecimalUtil.add(totalAmonut, result.getAmount());
//				result.setCdSignName(getCdSignName(result.getCdSign()));
////				result.setTradeTypeName(getTradeTypeName(result.getIsPrivateTrade()));
//				results.add(result);
//				if (i == data.size() - 1){
//					BankTradeDetailVO subtotal = new BankTradeDetailVO();
//					subtotal.setTopGroupName("小计：" + subtotalCount);
//					//subtotal.setBalance(subtotalBalance);
//					//subtotal.setAmount(subtotalAmonut);
//					results.add(subtotal);
//				}
//			}
////			BankTradeDetailVO end = new BankTradeDetailVO();
////			end.setTopGroupName("合计：" + totalCount);
////			end.setBalance(totalBalance);
////			end.setAmount(totalAmonut);
////			results.add(end);
//		}
//
//		ReportReturnVO reportReturnVO = new ReportReturnVO();
//
//		ReportVO reportVO = new ReportVO();
//
//		reportVO
//				.addHeader(HeaderVO.builder().key("topGroupName").title("所属集团").build())
//				.addHeader(HeaderVO.builder().key("bankAccount").title("账户号").build())
//				.addHeader(HeaderVO.builder().key("bankAccountName").title("账户名称").build())
//				.addHeader(HeaderVO.builder().key("bankName").title("银行名称").build())
//				.addHeader(HeaderVO.builder().key("opBankAccount").title("对方账号").build())
//				.addHeader(HeaderVO.builder().key("opBankAccountName").title("对方账号名称").build())
//				.addHeader(HeaderVO.builder().key("opBankName").title("对方银行").build())
//				.addHeader(HeaderVO.builder().key("cdSignName").title("收支方向").build())
////				.addHeader(HeaderVO.builder().key("tradeTypeName").title("交易类型").build())
//				.addHeader(HeaderVO.builder().key("amount").title("交易金额(元)").build())
//				.addHeader(HeaderVO.builder().key("balance").title("剩余金额(元)").build())
//				.addHeader(HeaderVO.builder().key("tradeDate").title("交易时间").build())
//				.addHeader(HeaderVO.builder().key("serialNo").title("流水号").build())
//				.addHeader(HeaderVO.builder().key("uses").title("用途").build())
//				.addHeader(HeaderVO.builder().key("voucherNo").title("回单号").build());
//		reportVO.setData(results);
//		reportReturnVO.setGrids(reportVO);
//		return reportReturnVO;
//	}
//
//	@Override
//	public ReportReturnVO privateTopublicsummaryList(PageData pd) {
//		List<BankTradeDetailVO> data = baseMapper.publicToPrivateDetail(pd);
//		List<BankTradeDetailVO> results = new ArrayList<>();
//		if (CollectionUtil.isNotEmpty(data)){
//			int totalCount = 0;
//			BigDecimal totalBalance = new BigDecimal(0);
//			BigDecimal totalAmonut = new BigDecimal(0);
//			int subtotalCount = 0;
//			BigDecimal subtotalBalance = new BigDecimal(0);
//			BigDecimal subtotalAmonut = new BigDecimal(0);
//			String lastTopGroupId = "";
//
//			for (int i = 0; i < data.size(); i++){
//				BankTradeDetailVO result = data.get(i);
//				if (StringUtil.isNotBlank(lastTopGroupId) && !lastTopGroupId.equals(result.getTopGroupId())){
//					BankTradeDetailVO subtotal = new BankTradeDetailVO();
//					subtotal.setTopGroupName("小计：" + subtotalCount);
//					subtotal.setBalance(subtotalBalance);
//					results.add(subtotal);
//					subtotalCount = 1;
//					subtotalBalance = result.getBalance();
//					subtotalAmonut = result.getAmount();
//				}else {
//					subtotalCount++;
//					subtotalBalance = BigDecimalUtil.add(subtotalBalance, result.getBalance());
//					subtotalAmonut = BigDecimalUtil.add(subtotalAmonut, result.getAmount());
//				}
//				lastTopGroupId = result.getTopGroupId();
//				totalCount++;
//				totalBalance = BigDecimalUtil.add(totalBalance, result.getBalance());
//				totalAmonut = BigDecimalUtil.add(totalAmonut, result.getAmount());
//				result.setCdSignName(getCdSignName(result.getCdSign()));
////				result.setTradeTypeName(getTradeTypeName(result.getIsPrivateTrade()));
//				results.add(result);
//				if (i == data.size() - 1){
//					BankTradeDetailVO subtotal = new BankTradeDetailVO();
//					subtotal.setTopGroupName("小计：" + subtotalCount);
//					subtotal.setBalance(subtotalBalance);
//					subtotal.setAmount(subtotalAmonut);
//					results.add(subtotal);
//				}
//			}
//			BankTradeDetailVO end = new BankTradeDetailVO();
//			end.setTopGroupName("合计：" + totalCount);
//			end.setBalance(totalBalance);
//			end.setAmount(totalAmonut);
//			results.add(end);
//		}
//
//		ReportReturnVO reportReturnVO = new ReportReturnVO();
//
//		ReportVO reportVO = new ReportVO();
//
//		reportVO
//				.addHeader(HeaderVO.builder().key("topGroupName").title("所属集团").build())
//				.addHeader(HeaderVO.builder().key("bankAccount").title("账户号").build())
//				.addHeader(HeaderVO.builder().key("bankAccountName").title("账户名称").build())
//				.addHeader(HeaderVO.builder().key("bankName").title("银行名称").build())
//				.addHeader(HeaderVO.builder().key("opBankAccount").title("对方账号").build())
//				.addHeader(HeaderVO.builder().key("opBankAccountName").title("对方账号名称").build())
//				.addHeader(HeaderVO.builder().key("opBankName").title("对方银行").build())
//				.addHeader(HeaderVO.builder().key("cdSignName").title("收支方向").build())
////				.addHeader(HeaderVO.builder().key("tradeTypeName").title("交易类型").build())
//				.addHeader(HeaderVO.builder().key("amount").title("交易金额(元)").build())
//				.addHeader(HeaderVO.builder().key("balance").title("剩余金额(元)").build())
//				.addHeader(HeaderVO.builder().key("tradeDate").title("交易时间").build())
//				.addHeader(HeaderVO.builder().key("serialNo").title("流水号").build())
//				.addHeader(HeaderVO.builder().key("uses").title("用途").build())
//				.addHeader(HeaderVO.builder().key("voucherNo").title("回单号").build());
//		reportVO.setData(results);
//		reportReturnVO.setGrids(reportVO);
//		return reportReturnVO;
//	}
//
//	@Override
//	public List<TradeStatisticsVO> Isprivate(PageData pageData){
//		List<TradeStatisticsVO> results = baseMapper.publicToPrivateBeyond(pageData);
//		return results;
//
//	}
//
//	private String getCdSignName(Integer cdSign){
//		if(Optional.ofNullable(cdSign).isPresent()){
//			switch (cdSign){
//				case 0:
//					return "收入";
//				case 1:
//					return "支出";
//				default:
//					return "";
//			}
//		}
//		return "";
//	}
//
//	private String getTradeTypeName(Integer isPrivateTrade){
//		if(Optional.ofNullable(isPrivateTrade).isPresent()){
//			switch (isPrivateTrade){
//				case 0:
//					return "公对公";
//				case 1:
//					return "公对私";
//				default:
//					return "";
//			}
//		}
//		return "";
//	}
//
//	private ReportReturnVO toReport(List<TradeStatisticsVO> results){
//		ReportVO reportVO = new ReportVO();
//		reportVO
//				.addHeader(HeaderVO.builder().key("topGroupName").title("集团名称").build())
//				.addHeader(HeaderVO.builder().key("tradeNumber").title("交易数量").build())
//				.addHeader(HeaderVO.builder().key("amount").title("交易金额（万元）").build());
//		if (CollectionUtil.isNotEmpty(results)){
//			TradeStatisticsVO end = TradeStatisticsVO.builder().topGroupName("合计").build();
//			for (TradeStatisticsVO result : results){
//				result.setAmount(BigDecimalUtil.divide(result.getAmount(), new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP));
//				end.setTradeNumber(BigDecimalUtil.integerAdd(end.getTradeNumber(), result.getTradeNumber()));
//				end.setAmount(BigDecimalUtil.add(end.getAmount(), result.getAmount()));
//			}
//			results.add(end);
//		}
//
//		ReportReturnVO reportReturnVO = new ReportReturnVO();
//		reportVO.setData(results);
//		reportReturnVO.setGrids(reportVO);
//		return reportReturnVO;
//	}
//
//	private ChartsVO toCharts(List<TradeStatisticsVO> results){
//		if (CollectionUtil.isNotEmpty(results)){
//			List<String> data = new ArrayList<>();
//			data.add("交易金额");
//			data.add("交易笔数");
//			LegendVO legendVO = LegendVO.builder().data(data).build();
//
//			List<XAxisVO> xAxisVOS = new ArrayList<>();
//			List<String> xList = new ArrayList<>();
//			List<Object> amountList = new ArrayList<>();
//			List<Object> tradeNumberList = new ArrayList<>();
//			for (TradeStatisticsVO result : results){
//				xList.add(result.getTopGroupName());
//				amountList.add(BigDecimalUtil.divide(result.getAmount(), new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP));
//				tradeNumberList.add(result.getTradeNumber());
//			}
//
//			List<SeriesVO> seriesVOS = new ArrayList<>();
//			seriesVOS.add(SeriesVO.builder().name("交易金额").type("bar").data(amountList).build());
//			seriesVOS.add(SeriesVO.builder().name("交易笔数").type("line").data(tradeNumberList).yAxisIndex(1).build());
//
//			xAxisVOS.add(XAxisVO.builder().data(xList).build());
//			ChartsVO chartsVO = ChartsVO.builder().legend(legendVO)
//					.xAxis(xAxisVOS).series(seriesVOS).build();
//			return chartsVO;
//		}
//		return null;
//	}
//
//
//
//
//}
